package com.demo.exception.controller;

import com.demo.exception.api.CommonController;
import com.demo.exception.api.CommonResult;
import com.demo.exception.pojo.User;
import com.demo.exception.pojo.ValidGroup;
import com.demo.exception.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import javax.validation.constraints.Email;
import java.util.List;


/**
 * <p>
 *  前端控制器
 *  Validated：可以用在类型、方法和方法参数上。但是不能用在成员属性（字段）上，不支持嵌套检测 可用于分组
 *  注意:当使用单参数校验时需要在Controller上加上@Validated注解，否则不生效。
 *  Valid：可以用在方法、构造函数、方法参数和成员属性（字段）上，支持嵌套检测(属性为其他自定义需校验类类)
 * </p>
 *
 * @author 小乌龟
 * @since 2022-11-13
 */
@RestController
@Api(tags = "用户接口")
@RequestMapping("/user")
@Validated
public class UserController extends CommonController {
    @Autowired
    private UserService userService;




        @PostMapping("/updateUser")
    @ApiOperation("update:修改用户")
    public CommonResult<Boolean> updateUser(@RequestBody @Validated(value = {ValidGroup.Crud.Update.class}) User user, BindingResult bindingResult) {
        //一般都在service层对结果集的返回处理 为了方便讲解就直接在此做处理 通过CommonController对controller进行封装 就不用在担心这个啦
        return CommonResult.success(userService.updateUser(user));
    }

    @PostMapping("/addUser")
    @ApiOperation("add:添加用户")
    public CommonResult<Boolean> addUser(@RequestBody @Valid User user) {
        return process(()->userService.addUser(user));
    }



//        @PostMapping("/addUser")
//    @ApiOperation("add:添加用户")
//    public CommonResult<Boolean> addUser(@RequestBody @Valid User user) {
//        return process(()->userService.addUser(user));
//    }

//


    @GetMapping("/testVail")
    @ApiOperation("test:测试参数校验")
    public  CommonResult testVail(@RequestParam @Email(message = "电子邮箱不合法") String email) {
       return  process(()->userService.test());
    }

    @PostMapping("/testList")
    @ApiOperation("test:测试校验List")
    public  CommonResult testList(@RequestBody @Valid List<User> users) {
        //一般都在service层对结果集的返回处理 为了方便讲解就直接在此做处理 通过CommonController对controller进行封装 就不用在担心这个啦
        return  CommonResult.success(users);
    }
    @PostMapping("/testListV")
    @ApiOperation("test:测试分组校验List")
    @Validated(value = ValidGroup.Crud.Update.class)
    public  CommonResult testListV(@RequestBody  @Valid  List<User> users) {
        //一般都在service层对结果集的返回处理 为了方便讲解就直接在此做处理 通过CommonController对controller进行封装 就不用在担心这个啦
        return  CommonResult.success(users);
    }
}
